我们要获取滑动窗口中的最大值,可以维护一个队列记录当前在滑动窗口中的数字,移动的时候往队列右边添加数字,在队列左边删除数字就好了。但是如何快速地获取队列中最大的元素呢?我们考虑下标为 i 和 j 并且满足 i 在 j 的左边(也即有 i<j)这样两个元素,则当 i 还在滑动窗口中时,j 也一定在滑动窗口中。当 j 的值不小于 i 的时候 i 不影响滑动窗口中的最大值,那么我们就可以把 i 从队列中删去了。那么最后我们只需要维护一个单调递减的队列。 每次从右边添加新数字的时候,删去右边所有比新数字更小的数,并把新数字加在右边中,仍然保持单调队列。然后我们检查队列的左边元素是否已经移出窗口,如果已经移出窗口则将其删去。这个时候,滑动窗口中的最大值其实就是队列最左边的元素(也即队列中最大的元素),这样我们便可以直接得到滑动窗口中的最大值。 从上面的分析中我们也可以发现,我们需要能够从队列左边或者右边增删数字,则需要用到双端队列 deque,而且判断队列左边是否需要删去的时候,我们需要判断下标,因此我们保存到队列中的信息是数组下标,而不是数字本身。